import random
import mysql.connector
from mysql.connector import Error
from datetime import datetime, timedelta

# 数据库配置
db_config = {
    'host': 'localhost',
    'database': 'bolg',  # 请替换为实际数据库名
    'user': 'root',      # 请替换为实际用户名
    'password': '123456',  # 请替换为实际密码
    'port': 3306                  # MySQL默认端口
}

# 文章标题候选池
titles = [
    "深入浅出理解{}", "{}开发实战指南", "从入门到精通：{}", "{}最佳实践",
    "{}性能优化技巧", "探索{}的奇妙世界", "{}常见问题与解决方案",
    "{}架构设计思路", "如何高效使用{}", "{}与现代Web开发",
    "{}技术综述", "{}在企业级应用中的应用", "{}入门教程",
    "{}高级编程技巧", "{}框架源码解析", "{}与微服务架构",
    "{}安全防护策略", "{}数据处理全解析", "{}实战项目分享",
    "{}开发环境搭建", "{}设计模式应用", "{}算法详解",
    "{}性能调优实战", "{}测试方法论", "{}部署流程详解",
    "{}与DevOps实践", "{}大数据分析案例", "{}机器学习应用",
    "{}容器化部署实践", "{}云原生技术应用"
]

# 文章内容段落候选池
paragraphs = [
    "在当今数字化时代，{}技术已经成为企业发展的核心驱动力。",
    "本文将深入探讨{}的原理、架构和应用场景，帮助读者全面掌握这一前沿技术。",
    "通过实际案例分析，我们可以看到{}在提升系统性能、降低成本方面的显著优势。",
    "对于开发者来说，掌握{}不仅能够提升个人技术能力，还能为职业发展带来更多机会。",
    "在实际项目中应用{}时，我们需要注意以下几个关键问题：...",
    "与传统技术相比，{}具有更高的灵活性和可扩展性，能够更好地满足现代业务需求。",
    "本文将从多个角度分析{}的优缺点，并给出相应的应用建议。",
    "随着技术的不断发展，{}也在不断演进，新的版本和功能不断推出。",
    "在使用{}进行开发时，遵循最佳实践能够有效提高开发效率和代码质量。",
    "通过对比不同的{}实现方案，我们可以选择最适合自己项目的技术栈。",
    "{}的应用场景非常广泛，涵盖了从Web开发到数据分析的各个领域。",
    "掌握{}的核心概念是深入学习这门技术的基础。",
    "在实际开发过程中，我们常常会遇到各种挑战，本文将分享一些解决这些问题的经验。",
    "对于企业来说，合理应用{}技术能够有效提升竞争力，实现数字化转型。",
    "本文还将介绍一些与{}相关的工具和框架，帮助开发者更高效地进行开发。",
    "通过本文的学习，读者将能够独立完成一个基于{}的完整项目开发。",
    "在未来的技术发展趋势中，{}有望成为主流技术之一。",
    "学习{}需要具备一定的基础知识，本文将从最基础的概念开始讲解。",
    "实践是掌握{}技术的关键，本文提供了丰富的代码示例和项目实战指导。",
    "了解{}的发展历程有助于我们更好地理解其设计理念和技术选择。",
    "在团队协作开发中，使用{}能够有效提高沟通效率和代码质量。",
    "本文还将探讨{}与其他热门技术的结合应用，为读者提供更广阔的技术视野。",
    "对于初学者来说，选择合适的学习资源和方法至关重要。",
    "通过分析{}的源码，我们可以深入理解其内部实现机制和设计模式。",
    "在生产环境中部署{}应用时，需要考虑性能、安全和可维护性等多个方面。",
    "{}的生态系统非常丰富，有大量的第三方库和工具可供选择。",
    "掌握{}的调试技巧能够帮助开发者快速定位和解决问题。",
    "本文将介绍一些优化{}应用性能的方法和技巧。",
    "随着{}技术的普及，相关的岗位需求也在不断增加。"
]

# 分类ID范围（根据category表数据）
category_ids = list(range(11, 31))

# 文章状态
statuses = ["已发布", "草稿", "已归档"]

# 作者列表
authors = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"]

# 用户ID范围
user_ids = list(range(1, 11))

# 生成随机日期（过去1年内）
def random_date():
    end_date = datetime.now()
    start_date = end_date - timedelta(days=365)
    random_days = random.randint(0, 365)
    return start_date + timedelta(days=random_days)

# 生成随机标题
def generate_title():
    # 从技术分类中随机选择一个
    category_names = [
        "云计算", "移动开发", "DevOps", "网络安全", "区块链",
        "产品管理", "人工智能", "游戏开发", "大数据", "数据库",
        "计算机基础", "创业经验", "效率工具", "健康生活", "理财投资",
        "视频制作", "Linux运维", "小程序开发", "性能优化", "行业动态",
        "前端开发", "后端开发", "机器学习", "设计", "职场", "开源项目",
        "技术", "生活", "读书笔记", "摄影"
    ]
    category_name = random.choice(category_names)
    title_template = random.choice(titles)
    return title_template.format(category_name)

# 生成随机内容
def generate_content():
    # 随机选择3-8个段落
    num_paragraphs = random.randint(3, 8)
    selected_paragraphs = random.sample(paragraphs, num_paragraphs)

    # 随机选择一个技术分类
    category_names = [
        "云计算", "移动开发", "DevOps", "网络安全", "区块链",
        "产品管理", "人工智能", "游戏开发", "大数据", "数据库",
        "计算机基础", "创业经验", "效率工具", "健康生活", "理财投资",
        "视频制作", "Linux运维", "小程序开发", "性能优化", "行业动态",
        "前端开发", "后端开发", "机器学习", "设计", "职场", "开源项目",
        "技术", "生活", "读书笔记", "摄影"
    ]
    category_name = random.choice(category_names)

    # 将分类名称替换到段落中
    content = "\n\n".join(p.format(category_name) for p in selected_paragraphs)
    return content

# 创建数据库连接
def create_db_connection(config):
    try:
        connection = mysql.connector.connect(**config)
        print("数据库连接成功")
        return connection
    except Error as e:
        print(f"数据库连接失败: {e}")
        return None

# 创建article表
def create_article_table(connection):
    cursor = connection.cursor()
    create_table_query = """
                         CREATE TABLE IF NOT EXISTS `article` (
                                                                  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '文章ID',
                                                                  `title` varchar(255) DEFAULT NULL COMMENT '文章标题',
                             `content` text COMMENT '文章内容',
                             `cover_img` varchar(255) DEFAULT NULL COMMENT '封面图片',
                             `status` varchar(50) DEFAULT NULL COMMENT '文章状态',
                             `category_id` bigint DEFAULT NULL COMMENT '分类ID',
                             `author` varchar(100) DEFAULT NULL COMMENT '作者',
                             `user_id` bigint DEFAULT NULL COMMENT '用户ID',
                             `click_count` int DEFAULT '0' COMMENT '点击量',
                             `like_count` int DEFAULT '0' COMMENT '点赞数',
                             `collect_count` int DEFAULT '0' COMMENT '收藏数',
                             `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                             `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                             PRIMARY KEY (`id`),
                             KEY `idx_category_id` (`category_id`),
                             KEY `idx_user_id` (`user_id`),
                             KEY `idx_create_time` (`create_time`)
                             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; \
                         """
    try:
        cursor.execute(create_table_query)
        connection.commit()
        print("article表创建成功或已存在")
    except Error as e:
        print(f"创建表失败: {e}")

# 批量插入文章数据
def insert_articles(connection, num_articles=1000):
    cursor = connection.cursor()
    insert_query = """
                   INSERT INTO `article`
                   (`title`, `content`, `cover_img`, `status`, `category_id`, `author`, `user_id`,
                    `click_count`, `like_count`, `collect_count`, `create_time`, `update_time`)
                   VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) \
                   """

    articles_data = []
    for i in range(1, num_articles + 1):
        title = generate_title()
        content = generate_content()
        cover_img = f"https://picsum.photos/seed/article{i}/800/400"
        status = random.choice(statuses)
        category_id = random.choice(category_ids)
        author = random.choice(authors)
        user_id = random.choice(user_ids)
        click_count = random.randint(0, 10000)
        like_count = random.randint(0, 5000)
        collect_count = random.randint(0, 1000)
        create_time = random_date()
        update_time = create_time + timedelta(minutes=random.randint(1, 360))

        articles_data.append((
            title, content, cover_img, status, category_id,
            author, user_id, click_count, like_count,
            collect_count, create_time, update_time
        ))

    # 分批插入，每批500条记录
    batch_size = 500
    for i in range(0, len(articles_data), batch_size):
        batch = articles_data[i:i+batch_size]
        try:
            cursor.executemany(insert_query, batch)
            connection.commit()
            print(f"已插入 {i+batch_size if i+batch_size < len(articles_data) else len(articles_data)}/{num_articles} 条记录")
        except Error as e:
            print(f"插入数据失败: {e}")
            connection.rollback()
            return False
    return True

# 主函数
def main():
    connection = create_db_connection(db_config)
    if connection:
        create_article_table(connection)
        success = insert_articles(connection, 1000)
        if success:
            print("成功插入1000条文章数据")
        connection.close()
        print("数据库连接已关闭")

if __name__ == "__main__":
    main()